from dataclasses import dataclass, field, Field

from entiys.methods.augument.SaveAttribute import SaveAttribute


@dataclass
class mapMovePolicy:
    """
    地图移动的策略
    DESCIRPT:
        可以设置一些移动的规则 使用to_list获取这些规则内可以移动的地图点
    """
    only_dynasties: list = field(default_factory=list)  # 当前国家的所有地图
    exclude_dynasties : list= field(default_factory=list)  # 不能存在的国家
    exclude  : list= field(default_factory=list)  # 地图不能存在
    must_has  : list= field(default_factory=list)  # 必须存在的地图
    saveAttribute  : SaveAttribute = field(default_factory=lambda :None)

    def getPointDy(self, dyname):
        """
        [需要加载后使用:loadSave] 获取当前的王朝里的所有point
        :param dyname:  王朝的名称
        :return:
        """
        mapdata = self.saveAttribute.mapJSON().map_data
        json_dy: dict = mapdata.get(dyname)  # 当前王朝的JSON
        dy_points = list(json_dy.keys())  # 当前王朝的所有point
        return dy_points

    def to_list(self):
        """
        返回策略内可以进行移动的所有地图点
        :return:
        """
        maps = self.saveAttribute.mapJSON()  # 加载当前的存档地图
        maps_data: dict = maps.map_data
        all_dy: list = maps.all_dy

        passdata = []

        if len(self.only_dynasties) > 0:
            for dy in self.only_dynasties:
                passdata += self.getPointDy(dy)
        else:
            passdata = maps.all_point  # 除非指定了only_dynasties 默认允许去往任何地方

        if len(self.exclude_dynasties) > 0:
            for dy in self.exclude_dynasties:  # 遍历当前所有的国家
                dy_points = self.getPointDy(dy)  # 获取当前遍历的国家点的所有地图
                for dy_point in dy_points:  # 遍历所有的地图
                    if dy_point in passdata:  # 如果当前可选点有这个地图
                        passdata.remove(dy_point)  # 删除他

        if len(self.exclude) > 0:  # 当前可排除的点
            for i in self.exclude:
                if i in passdata:
                    passdata.remove(i)

        if len(self.must_has) > 0:  # 当前必须有的点
            for i in self.exclude:
                if i not in passdata:
                    passdata.append(i)

        passdata = list(set(passdata))  # 去重

        return passdata


class preinstall:
    """
    这里是一些预设策略
    """

    @staticmethod
    def NOHOME(save):
        mapmove = mapMovePolicy(exclude_dynasties="家", saveAttribute=save)
        return mapmove

